import js from "@eslint/js";
import pluginVue from "eslint-plugin-vue";
import * as parserVue from "vue-eslint-parser";
import configPrettier from "eslint-config-prettier";
import pluginPrettier from "eslint-plugin-prettier";
import { defineFlatConfig } from "eslint-define-config";
import * as parserTypeScript from "@typescript-eslint/parser";
import pluginTypeScript from "@typescript-eslint/eslint-plugin";

export default defineFlatConfig([
  {
    ...js.configs.recommended,
    ignores: ["src/assets/**", "src/**/iconfont/**"],
    languageOptions: {
      globals: {}
    },
    plugins: {
      prettier: pluginPrettier
    },
    rules: {
      ...configPrettier.rules,
      ...pluginPrettier.configs.recommended.rules,
       // 禁止使用 var
      'no-var': 'error',
      // 禁止使用 console
      'no-console': 0,
      // 禁止使用 debugger
      "no-debugger": "off",
      // 禁止不必要的转义字符
      'no-useless-escape': 0,
      // 禁止出现未使用过的变量，忽略 _ 开头的参数和变量
      "no-unused-vars": [
        "error",
        {
          argsIgnorePattern: "^_",
          varsIgnorePattern: "^_"
        }
      ],
      "prettier/prettier": [
        "error",
        {
          endOfLine: "auto"
        }
      ]
    }
  },
  {
    files: ["**/*.?([cm])ts", "**/*.?([cm])tsx"],
    languageOptions: {
      parser: parserTypeScript,
      parserOptions: {
        sourceType: "module"
      }
    },
    plugins: {
      "@typescript-eslint": pluginTypeScript
    },
    rules: {
        ...pluginTypeScript.configs.strict.rules,
        "@typescript-eslint/ban-types": "off",
        // 检查并报错重复声明的变量
        "@typescript-eslint/no-redeclare": 2,
        // 关闭对 TypeScript 注释的限制
        "@typescript-eslint/ban-ts-comment": 0,
        // 允许使用显式的 `any` 类型
        "@typescript-eslint/no-explicit-any": 0,
        // 建议使用 `as const` 而不是 `const` 断言类型
        "@typescript-eslint/prefer-as-const": 1,
        // 允许使用非空断言 `!`
        "@typescript-eslint/no-non-null-assertion": 0,
        // 强制导入类型时不产生副作用
        "@typescript-eslint/no-import-type-side-effects": 2,
        // 关闭对显式指定导出函数和类的类型的要求
        "@typescript-eslint/explicit-module-boundary-types": 0,
        // 强制一致的类型导入方式
        "@typescript-eslint/consistent-type-imports": [
          2,
          { disallowTypeAnnotations: false, fixStyle: "inline-type-imports" }
        ],
        // 建议优先使用字面量枚举成员
        "@typescript-eslint/prefer-literal-enum-member": [
          2,
          { allowBitwiseExpressions: true }
        ],
        "@typescript-eslint/no-unused-vars": [
          "error",
          {
            argsIgnorePattern: "^_",
            varsIgnorePattern: "^_"
          }
        ]
      },
    },
  {
    files: ["**/*.?([cm])js"],
    rules: {
      "@typescript-eslint/no-require-imports": "off",
      "@typescript-eslint/no-var-requires": "off"
    }
  },
  {
    files: ["**/*.d.ts"],
    rules: {
      "eslint-comments/no-unlimited-disable": "off",
      "import/no-duplicates": "off",
      "unused-imports/no-unused-vars": "off"
    }
  },
  {
    files: ["**/*.vue"],
    languageOptions: {
      globals: {},
      parser: parserVue,
      parserOptions: {
        ecmaFeatures: {
          jsx: true
        },
        extraFileExtensions: [".vue"],
        parser: "@typescript-eslint/parser",
        sourceType: "module"
      }
    },
    plugins: {
      vue: pluginVue
    },
    processor: pluginVue.processors[".vue"],
    rules: {
        ...pluginVue.configs.base.rules,
        ...pluginVue.configs["vue3-essential"].rules,
        ...pluginVue.configs["vue3-recommended"].rules,
        // 关闭对于组件 props 需要默认值的检查
        "vue/require-default-prop": 0,
        // 关闭对于单行 HTML 元素内容换行的检查
        'vue/singleline-html-element-content-newline': 0,
        // 关闭对于每行 HTML 属性数量的限制检查
        'vue/max-attributes-per-line': 0,
        // 强制自定义事件的命名为驼峰式命名
        'vue/custom-event-name-casing': [2, 'camelCase'],
        // 显示警告，不建议使用 v-text 指令
        'vue/no-v-text': 1,
        // 显示警告，建议在 Vue 组件中添加间距行
        'vue/padding-line-between-blocks': 1,
        // 显示警告，建议直接导出 Vue 组件
        'vue/require-direct-export': 1,
        // 允许使用单个单词作为组件名
        'vue/multi-word-component-names': 0,
        // 关闭对于 TypeScript 注释的检查
        '@typescript-eslint/ban-ts-comment': 0,
        // 关闭对于显式声明 any 类型的检查
        '@typescript-eslint/no-explicit-any': 0,
        "no-unused-vars": "off",
    }
  }
]);
